
/**
 * 数字格式化处理:
 *  采用字符串截取的方式
 * @author xiufu.wang
 */
import Decimal from 'decimal.js';
const EMAIL_REGEX = /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/
const NUMBER_REGEX = /^-?[0-9]*.?[0-9]+$/
const MOBILE_REGEX = /^1[3|4|5|7|8][0-9]\d{8}$/
const PHONE_REGEXX = /^([0-9]{3,4})-?[0-9]{7,8}$/
const IDCARD_REGEX = /^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}(?:[0-9]|X)$|^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$/
const CHINESE_REGEX = /^[\u4e00-\u9fa5]+$/
const UNCOMMAFY_REGEX = new RegExp("[^0-9-.]", ["g"])
const COMMAFY_REGEX = /(\d{3})(?=\d)/g


// 删除整数位和小数位 多余的0
function removeZeroChar(str, isInit) {
    str = str || ''
    str = str.trim() || '0'
    let pos = isInit ? 0 : str.length - 1
    let strArr = str.split('')
    let hasBreak = false
    while ((isInit && (pos < str.length) || (!isInit && pos >= 0)) && !hasBreak) {
        if (strArr[pos] === '0') {
            strArr[pos] = ''
        } else {
            hasBreak = true
        }
        if (isInit) {
            pos++
        } else {
            pos--
        }
    }

    return isInit ? (strArr.join('') || '0') : (strArr.join(''))
}

//判断是否位空数据
export function isEmptyNumber(input) {
    return (input === null || input === undefined || (typeof input === 'string' && !input.trim()))
}

// 获取单位长度
function getUnitLen(unit, reverseUnit) {
    if (isEmptyNumber(unit)) {
        return 0
    }
    if (unit < 1) {
        return (String(unit).split('.')[1].length) * (-1) * (reverseUnit === true ? -1 : 1)
    }
    if (unit > 1) {
        return (String(unit).trim().split('').length - 1) * (reverseUnit === true ? -1 : 1)
    }
}

// 精度处理
function resolveDecimal(dseps, decimal) {
    decimal = +decimal
    if (dseps.length >= decimal) {
        //删除多余的输入小数
        dseps = dseps.slice(0, decimal)
    } else {
        //补小数位0
        dseps = dseps.concat(Array.from({ length: decimal - dseps.length }).map(() => '0'))
    }
    return dseps
}

// 千分位处理
export function formatThousands(v, reverse) {
    if (reverse) {
        if (isEmptyNumber(v)) {
            return v
        } else {
            v = String(v)
            return typeof v === 'string' ? v.replace(UNCOMMAFY_REGEX, "") : v
        }
    }
    v = String(v).trim();
    let iseps = v.split('.')[0]
    const dseps = v.split('.')[1] || ''
    const isF = v[0] === '-';
    if (isF){
        iseps = iseps.slice(1);
    }
    if (!reverse) {
        const mod = iseps.length > 3 ? iseps.length % 3 : 0
        return (isF ? '-' : '') + (mod ? (iseps.substr(0, mod) + ',') : '') + iseps.substr(mod).replace(COMMAFY_REGEX, "$1" + ',') + (dseps.length > 0 ? '.' : '') + dseps
    }
}

/**
 * 数字：精度、单位、千分位转换
 * @param {*} param0 {input, unit, decimal指的是用户输入精度, thousands}
 * @returns { input原始值, value: 转换结果, option配置 }
 */
export default function number_format({ input, unit, decimal, thousands, reverseUnit, returnFormatDecimal, firstFormatDecimal }) {
    // 不是一个空值
    let value = '';
    let option = { unit, decimal, thousands };
    let _input;
    input = typeof input === 'string' && input[input.length - 1] === '.' ? input.slice(0, input.length - 1) : input;
    if (isEmptyNumber(input) || !NUMBER_REGEX.test(_input = String(input).trim())) {
        return {
            input,
            value,
            option
        }
    }

    //四色五入
    if (firstFormatDecimal === true && NUMBER_REGEX.test(String(decimal))){
        _input = Decimal(_input).toFixed(decimal);
    }

    const isF = _input[0] === '-'
    _input = isF ? _input.slice(1) : _input
    let seps = _input.split('.')
    let iseps = removeZeroChar(seps[0], true).split('')
    let dseps = removeZeroChar(seps[1], false).split('')

    /**
     * 如果同时传递单位和精度，则先转换单位  在转换精度
     */
    // 控制用户输入精度
    if (firstFormatDecimal === true && NUMBER_REGEX.test(String(decimal))) {
        dseps = resolveDecimal(dseps, decimal)
    }

    //------------------格式化单位 start--------------------------------------
    let iunit = getUnitLen(unit, reverseUnit)
    if (iunit > 0) {
        iseps = iseps.concat(Array.from({ length: iunit }).map((r, index) => (dseps[index] !== undefined ? dseps[index] : '0')))
        dseps = dseps.length <= iunit ? [] : dseps.slice(iunit)
    } else {
        if (iunit < 0) {
            const temp = Array.from({ length: iunit * (-1) }).map(() => '0').concat(iseps)
            dseps = temp.slice(iunit).concat(dseps)
            iseps = temp.slice(0, temp.length + iunit)
        }
    }
    //------------------格式化单位 end--------------------------------------
    iseps = removeZeroChar(iseps.join(''), true)
    dseps = removeZeroChar(dseps.join(''), false)
    // 
    // if (returnFormatDecimal === true && NUMBER_REGEX.test(String(decimal))) {
    //     dseps = resolveDecimal(dseps.split(''), decimal).join('')
    // }

    const isDecimal = (returnFormatDecimal === true && NUMBER_REGEX.test(String(decimal)))
    //------------------千分位处理--start------------------------------------
    if (!isDecimal && thousands === true) {
        iseps = formatThousands(iseps, false)
    }
    //------------------千分位处理--end------------------------------------
    value = (isF ? '-' : '') + iseps + (dseps.length > 0 ? ('.' + dseps) : dseps);

    if (isDecimal) {
        value = Decimal(value).toFixed(decimal);
        if (thousands === true){
            value = formatThousands(value, false)
        }
    }
    return {
        input,
        value,
        option
    }

}